package cn.wen.bases;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;

/**
 * Title：应用程序(临时)属性
 * <p>
 * Description：
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2012/4/28 Description：初完成。
 *          <p>
 */
public class TempProperties implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
	if (properties == null) throw new NullPointerException("property \"properties\" is null!");
    }

    /**
     * 临时属性（集）
     */
    protected static final Map<String, Object> properties = new HashMap<String, Object>();

    /**
     * 设置临时属性（集）
     */
    public void setProperties(Map<String, Object> map) {
	if (map == null || map.isEmpty()) {
	    return;
	}
	properties.putAll(map);
    }

    /**
     * 获取临时属性（集）
     */
    public static Map<String, Object> getProperties() {
	return properties;
    }

    /**
     * 获取临时属性
     * 
     * @param key 属性对应key
     * @return 临时属性
     */
    public static Object get(String key) {
	return properties.get(key);
    }

    /**
     * 获取类型转换后的临时属性。
     * 
     * @param key 属性对应key
     * @param clz 目标类型
     * @return 临时属性
     */
    public static <T> T get(String key, Class<T> clz) {
	return (T) properties.get(key);
    }

    /**
     * Key 不能是Null 或 ""，否则不加入临时属性并返回Null。
     * <p>
     * 相当于：<code> add(key, value, false); </code>
     * 
     * @see #add(String, Object, boolean)
     */
    public static Object add(String key, Object value) {
	if (StringUtils.isBlank(key)) {
	    return null;
	}
	return properties.put(key, value);
    }

    /**
     * Key 不能是Null 或 ""，否则不加入临时属性并返回Null。
     * 
     * @param key the key
     * @param value the value
     * @param replace 若属性已存在，需表明是否替换原始属性的标识。=>true：新属性覆盖原始属性；false：丢弃新属性，保持原始属性。
     * @return
     */
    public static Object add(String key, Object value, boolean replace) {
	if (!properties.containsKey(key)) {
	    return add(key, value);
	}

	if (replace) {
	    return add(key, value);
	}
	else {
	    return null;
	}
    }

    /**
     * 可移除对应的临时属性。
     */
    public static Object remove(String key) {
	return properties.remove(key);
    }

}
